import Vue from 'vue'

//引入vue-router，并注册使用
import VueRouter from 'vue-router'
Vue.use(VueRouter)

// 引入配置信息
import routes from './routes'
// 引入store
import store from '@/store'

//重写VueRouter身上的push，replace方法，避免编程式导航多次执行带来的错误，replace同理
let orignPush = VueRouter.prototype.push;
VueRouter.prototype.push = function (location, resolve, reject) {
    if (reject && resolve) {
        orignPush.call(this, location, resolve, reject)
    } else {
        orignPush.call(this, location, () => { }, () => { })
    }
}

let orignReplace = VueRouter.prototype.replace;
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (reject && resolve) {
        orignReplace.call(this, location, resolve, reject)
    } else {
        orignReplace.call(this, location, () => { }, () => { })
    }
}

let router = new VueRouter({
    routes,
    // 滚动行为scrollBehavior(to, from, savePosition)
    scrollBehavior() {
        return { x: 0, y: 0 }
    },
})

// 全局前置守卫
router.beforeEach(async (to, from, next) => {
    // next是一个放行函数 
    // 例如：直接放行 -- next() 
    // 放行到指定路径 -- next('/home')
    // 不放行 next(false)
    // 如果没有token，用户没有登陆
    let token = store.state.user.token;
    let name = store.state.user.userInfo.name || '';
    if (token) {
        // 已经登陆 则不能去登陆页
        if (to.path == '/login' || to.path == '/register') {
            if (name) {
                next('/home');
            } else {
                try {
                    // 没有userInfo 登出
                    await store.dispatch('userLogout');
                    next(to.path)
                } catch (error) {
                    alert(error.message);
                }
            }
        } else {
            // 有token 有用户名 直接放行
            if (name) {
                next()
            } else {
                // 有token 没有用户名 捞用户名
                try {
                    await store.dispatch("getUserInfo");
                    next();
                } catch (error) {
                    // token 可能失效了
                    await store.dispatch('userLogout');
                    next('/login')
                }
            }
        }
    } else {
        // 没有登陆时不能去购物车、支付相关和个人中心
        let topath = to.path;
        if (topath.includes('/trade') || topath.includes('/pay') || topath.includes('/center') || topath.includes('cart')) {
            // 把未登录时没去成的地址 在登录后前往
            next('/login?redirect=' + topath)
        } else {
            next();
        }
    }
})

export default router;
